/* Copyright (C) 2021 Rain */

/* This file is part of XNIX. */

/* 
  XNIX is free software: you can redistribute it and/or modify 
  it under the terms of the GNU General Public License as published by 
  the Free Software Foundation, either version 3 of the License, or 
  (at your option) and later version. 
*/

/*
  XNIX is distributed in the hope that it will be useful, 
  but WITHOUT ANY WARRANTY; without even the implied warranty of 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  GNU General Public License for more details. 
*/

/*
  You should have received a copy of the GNU General Public License 
   along with XNIX. If not, see <https://www.gnu.org/licenses/>.  
*/




#include <kernel/init.h>
#include <kernel/errno.h>
#include <kernel/types.h>

#include <kernel/console.h>
#include <kernel/vsprintf.h>
#include <kernel/tty.h>

#include <lib/string.h>
#include <lib/fifo.h>



static char buffer[256];
struct tty *stdout;

/* read a character from tty (keyboard) with non-cooked */

int tty_read(struct tty *tty, char *buf, size_t nbytes) {
	if (!buf) 
		return -EINVAL;

	if (!nbytes) 
		return 0;

	/* it's read-only */
	if (!tty->input_fifo) 
		/* read from stdout, or stderr */
		return -EINVAL;

	return -EIO;
}


int tty_write(struct tty *tty, char *buf, size_t nbytes) {
	if (!buf) 
		return -EINVAL;

	if (!nbytes) 
		return 0;

	int i;

	for (i = 0; i < nbytes; i++) {
		if (!buf[i]) 
			return i;

		tty->putc(tty, buf[i]);
	}

	return i;
}



int printk(__uint8_t color, char *s, ...) {
	va_list args;
	int i;

	/* I think 256 is enough in kernel */
	/* too long, return it. */

	va_start(args, s);

	/* it maybe overflow, but that's in .data section and we did check. */

	i = vsprintf(buffer, s, args);
	print(color, buffer);
	
	memset(buffer, 0, 256);

	va_end(args);

	return i;
}

void print(__uint8_t color, char *s) {
	while (*s) {
		stdout->putc(stdout, *s);
		putc(*s++, color);
	}

	return;
}
